1316번 그룹 단어 체커
Day6 6단계 20231024
(해결 날짜 : 20231026)
- 내 풀이
- String의 특정 문자가 이미 나온 적이 있는 지를 판단하기 위해 Map을 사용해서 그 문자가 존재 했었는지를 저장했다.
- 배열로 저장하기엔 문자열이 100개까지 들어올 수 있고, 문자열 길이가 100까지 될 수 있기 때문에 일일이 배열을 배정하는 건 메모리 낭비일 것 같았다.
- Map에 String의 문자들을 저장하는데, 키를 문자로, 값은 1로 고정 시켰다.
- 이 때 최초로 추가하는 키 문자들은 이미 Map에 해당 키가 있는지 확인하고 추가해줬다.
- 등장 횟수를 굳이 여러 번 카운트 할 필요가 없기 때문이다.(Map<Character, Boolean>으로 true, false를 쓰는게 더 좋았을 수도 있다.)
- 현재 인덱스의 문자와 다음 인덱스의 문자를 비교하므로 String 내 문자 인덱스는 length()-1까지만 확인해야 String 길이를 넘어가지 않는다.
- 두 인덱스(현재, 다음)에서의 문자를 비교했을 때 같으면 아무런 동작이 필요 없으니 다를 때만 고려한다.
- 만약 다르다면, 그리고 현재 인덱스의 다음 문자가 이미 Map에 키로 존재한다면 그룹 단어가 아니므로, 전체 단어 개수에서 1을 빼주고 Map의 데이터를 초기화한다.
- 이 경우에 현재 String의 문자를 더 비교하는 것은 의미 없으므로, 다음 String을 받아 데이터가 초기화된 Map으로 위 순서를 다시 반복한다.
- String의 특정 문자가 이미 나온 적이 있는 지를 판단하기 위해 Map을 사용해서 그 문자가 존재 했었는지를 저장했다.
import java.io.*;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
Map<Character, Integer> groupData = new HashMap<>();
int groupNum = num;
pass: for(int i = 0; i < num; i++) {
String str = br.readLine();
for(int j = 0; j < str.length(); j++) {
if(!groupData.containsKey(str.charAt(j))) {
groupData.put(str.charAt(j), 1);
}
if (j < str.length() - 1) {
if(str.charAt(j) != str.charAt(j+1)) {
if (groupData.containsKey(str.charAt(j+1))) {
groupNum--;
groupData.clear();
continue pass;
}
}
}
}
groupData.clear();
}
System.out.println(groupNum);
br.close();
}
}
- 다른 사람 풀이
- 배열의 크기가 전체 소문자 알파벳 개수인 배열을 만들어서 각 알파벳 등장 빈도를 저장한다.
- 배열의 인덱스는 String.charAt(i) - 97로, 소문자 알파벳의 아스키 코드 정수값과 동일하다.
- String.length()까지 int i = 0;를 루프를 돌린다. 문자 확인은 String.charAt(i)로 한다.
- 만약 연속해서 같은 문자가 들어오면 현재 문자와 다음 문자가 다를때까지 String의 인덱스 마지막까지 루프를 돌리고, 중간에 break되면 그 문자의 아스키 코드를 인덱스로 갖는 배열의 요소를 1 더해준다.
- 만약 현재 문자와 다음 문자가 다르고, 현재 문자를 인덱스로 갖는 배열 요소가 0 이면 요소를 1 더해준다.
- 다음 문자들을 확인하다가 이전에 등장한 적 있는 문자를 인덱스로 가지는 경우가 생기면, 그 문자에 해당하는 인덱스의 요소는 0이 아니므로, 그룹 단어가 아니기 때문에 전체 문자 개수에서 1 감소시켜주고, 현재 String의 확인을 종료한다.
- 내 풀이와 다른 점은 내가 Map을 써서 더 복잡하게 풀었다는 것이고, 큰 아이디어 틀은 비슷한 것 같다.
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int count = 0;
while(n-- > 0) {
String s = sc.next();
int len = s.length();
int[] array = new int[26];
for(int i = 0; i < len; i++) {
if(array[s.charAt(i)-97] == 0) {
while(i+1 < len && s.charAt(i+1) == s.charAt(i)) {i++;}
}
else {
count--;
break;
}
array[s.charAt(i)-97]++;
}
count++;
}
System.out.println(count);
}
}